package com.ly.pj.goods.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class PraGoodsDao implements PGoodsDao{
    @Autowired
    private DataSource dataSource;

    /*查询商品信息，一行记录映射为内存中的一个map对象*/
    @Override
    public List<Map<String, Object>> findGoods() throws Throwable {
        //声明连接对象
        Connection connection=null;
        //声明语句对象
        Statement statement=null;
        //声明结果集对象
        ResultSet resultSet=null;
        //声明查询语句
        String sql="select id,name,remark,createdTime from tb_goods";
       try {
           //1.获取连接对象（通过Datasource接口获取）
           connection=dataSource.getConnection();
           //2.获取语句对象（Statement）
           statement=connection.createStatement();
           //3.执行查询语句获取结果集
           resultSet=statement.executeQuery(sql);
           //4.处理结果集
           //声明一个list集合用来存放结果集
           List<Map<String,Object>> list=new ArrayList<>();
           //遍历结果集
           while (resultSet.next()){
               //把结果集中的数据放到list集合中去
               list.add(rowMap(resultSet));
           }
           //返回list集合
           return list;
       }catch (Throwable t){
           //打印异常到控制台
           t.printStackTrace();
           //转换为非检查型异常（编译时不检测的异常）
           throw new RuntimeException(t);
       }finally {
           //5.关闭资源
           close(resultSet, statement, connection);
       }
    }

    /**
     * 返回值类型为Map<String,Object> 方法名称问rowMap，传参为ResultSet对象
     * @param resultSet 结果集对象
     * @return
     * @throws Throwable 异常顶级父类
     */
    private Map<String, Object> rowMap(ResultSet resultSet) throws Throwable{
        //new一个map
        Map<String,Object> rowMap=new HashMap<>();
        //ResultSetMetaData接口用于获取关于 ResultSet 对象中列的类型和属性信息的对象
        ResultSetMetaData resultSetMetaData=resultSet.getMetaData();

        int cols=resultSetMetaData.getColumnCount();
        for (int i = 1; i <=cols ; i++) {
            /**
             * ResultSetMetaData getMetaData()
             *           获取此 ResultSet 对象的列的编号、类型和属性。 返回值是ResultSetMetaData类型
             *
             * getObject(String columnLabel, Map<String,Class<?>> map)
             *           以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。
             *
             * put(K key, V value)
             *           将指定的值与此映射中的指定键关联（可选操作）。
             */
            rowMap.put(resultSetMetaData.getColumnLabel(i),resultSet.getObject(resultSetMetaData.getColumnLabel(i)));
        }
        return rowMap;
    }

    /**
     * 关闭资源
     * @param resultSet 结果集对象
     * @param statement 语句对象
     * @param connection 连接对象
     */

    private void close(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet!=null){try{resultSet.close();}catch (Throwable t){t.printStackTrace();}}
        if (statement!=null){try{statement.close();}catch (Throwable t){t.printStackTrace();}}
        if (connection!=null){try{connection.close();}catch (Throwable t){t.printStackTrace();}}

    }
}
